package calculator;

import store.Ricetta;
import dataview.Report;
import dataview.Ricette;
import dataview.TipoReportRicette;
import dataview.TipoTermine;

public class GeneraReportRicette extends GeneraReport {
	
	public static Report generaReportRicette(Ricette contenuto, TipoReportRicette tipo) {
		switch (tipo) {
			case Ridotto:
				return report(contenuto, false, false, false);
			case Completo:
				return report(contenuto, true, false, false);
			case Completo_con_sottoricette:
				return report(contenuto, true, false, true);
			case Completo_con_valutazioni:
				return report(contenuto, true, true, false);
			default:
				return null;
		}
	}
	
	private static void dettagliRicetta(Ricetta ricetta, Report report, boolean completo, boolean conValutazioni){
		report.aCapo();
		report.aggiungiRiga("nome", ricetta.getNome());
		String presentazione = "";
		if (ricetta.getInfo() != null && ricetta.getInfo().getPresentazione() != null) presentazione = ricetta.getInfo().getPresentazione();
		report.aggiungiRiga("descrizione", presentazione);
		if (completo) {
			if (ricetta.getInfo() != null) {
				if (ricetta.getInfo().getDifficolta() != null) report.aggiungiRiga("difficolta", ricetta.vis().getDifficolta());
				if (ricetta.getInfo().getNote() != null) report.aggiungiRiga("note", ricetta.vis().getNote());
				if (ricetta.getInfo().getNumeroPorzioni() != 0 && ricetta.getInfo().getUnitaPorzioni() != null)
					report.aggiungiRiga("porzioni", ricetta.vis().getPorzioni());
			}
			if (ricetta.getTag() != null && !ricetta.getTag().isEmpty()) {
				if (!ricetta.getTag().getTerminiDiTipo(TipoTermine.tipo_preparazione).isEmpty())
					report.aggiungiRiga("tipo preparazione", ricetta.getTag().getTerminiDiTipo(TipoTermine.tipo_preparazione).toString());
				if (!ricetta.getTag().getTerminiDiTipo(TipoTermine.genere_cucina).isEmpty())
					report.aggiungiRiga("genere cucina", ricetta.getTag().getTerminiDiTipo(TipoTermine.genere_cucina).toString());
				if (!ricetta.getTag().getTerminiDiTipo(TipoTermine.genere_geografico).isEmpty())
					report.aggiungiRiga("genere geografico", ricetta.getTag().getTerminiDiTipo(TipoTermine.genere_geografico).toString());
			}
			if (conValutazioni) {
				for (String val : ricetta.vis().conTutteValutazioni().getValutazioni())
					report.aggiungiRiga(val.substring(0, val.indexOf(':')), val.substring(val.indexOf(':') + 1, val.length()));
			}
			if (ricetta.vis().getIngredienti().length() > 0) report.aggiungiRiga("ingredienti", ricetta.vis().getIngredienti());
			if (!ricetta.getProcedimento().isEmpty()) {
				report.aggiungiRiga("procedimento", "");
				int i = 1;
				for (String passo : ricetta.vis().getProcedimento()) {
					report.aggiungiRiga(i + ") " + passo);
					i++;
				}
			}
		}
	}
	
	private static Report report(Ricette contenuto, boolean completo, boolean conValutazioni, boolean conSottoricette) {
		Report report = new Report();
		report.aggiungiTitolo("Report Ricette");
		report.aCapo();
		for (Ricetta ricetta : contenuto) {
			dettagliRicetta(ricetta, report, completo, conValutazioni);
			if(conSottoricette)
				for(Ricetta r : ricetta.sottoRicette())
					dettagliRicetta(r, report, completo, conValutazioni);
		}
		return report;
	}
}
